/**
 * 项目名：	Rumba Plan
 * 
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2006，所有权利保留。
 * 
 * 文件名：	BManager.java
 * 模块说明：	
 * 修改历史：
 * 2006-4-28 - lxm - 创建。
 */
package com.hd123.rumba.runtime.biz;

import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.gwt.base.client.exception.ClientBizException;
import com.hd123.rumba.gwt.base.server.biz.BPersistentReader;
import com.hd123.rumba.runtime.IManager;
import com.hd123.rumba.runtime.IPersistent;
import com.hd123.rumba.runtime.IVersionedPersistent;
import com.hd123.rumba.runtime.Manager;
import com.hd123.rumba.util.ClassifiedHashtable;
import com.hd123.rumba.util.ObjectUtil;

/**
 * 管理员对象基类 | 业务层 | 管理员 | 实现类
 * 
 * @author lxm
 * 
 */
public abstract class BManager extends Manager implements IBManager {

  public abstract IManager getPerzMgr() throws BusinessException;

  /**
   * 根据指定的业务对象类型，创建业务对象。
   * 
   * @param bizClass
   *          指定业务对象类型。
   * @return
   * @throws BusinessException
   */
  protected <T extends BPersistent> T createBizClass(Class<T> bizClass) throws BusinessException {
    return this.createBizClass2(bizClass);
  }

  /**
   * 根据指定的业务对象类型，创建业务对象。
   * 
   * @param bizClass
   *          指定业务对象类型。
   * @return
   * @throws BusinessException
   */
  protected <T extends com.hd123.rumba.gwt.base.client.biz.BPersistent> T createBizClass2(
      Class<T> bizClass) throws BusinessException {
    T bobj = null;
    try {
      bobj = (T) bizClass.newInstance();
    } catch (Exception e) {
      throw new BusinessException(e);
    }
    return bobj;
  }

  /**
   * 从指定的持久层对象复制值给指定的业务层对象。
   * 
   * @param <B>
   * @param
   *          <P>
   * @param perz
   *          指定的持久层对象。不允许null。
   * @param biz
   *          指定的业务层对象。不允许null。
   * @throws BusinessException
   */
  protected <B extends com.hd123.rumba.gwt.base.client.biz.BPersistent, P extends IPersistent> void assignPerzToBiz(
      P perz, B biz) throws BusinessException {
    ObjectUtil.checkParameterNotNull(perz, "perz");
    ObjectUtil.checkParameterNotNull(biz, "biz");
    if (biz instanceof com.hd123.rumba.runtime.biz.BPersistent) {
      ((com.hd123.rumba.runtime.biz.BPersistent) biz).readFrom(perz);
    } else {
      try {
        BPersistentReader reader = (BPersistentReader) Class.forName(biz.getReaderClassName())
            .newInstance();
        reader.setTarget(biz);
        reader.read(perz);
      } catch (ClientBizException e) {
        throw new BusinessException(e);
      } catch (InstantiationException e) {
        throw new BusinessException(e);
      } catch (IllegalAccessException e) {
        throw new BusinessException(e);
      } catch (ClassNotFoundException e) {
        throw new BusinessException(e);
      }
    }
  }

  /**
   * 提供对于实体的共享检查。
   * 
   * @param entity
   *          被检查的实体对象。
   * @param oca
   * @param classCaption
   *          实体名，例如：IUser.CAPTION_CLASS
   * @param entitySpec
   *          实体描述，例如：user.getCodeName();
   * @return 返回错误信息，若没有则返回null。
   * @throws BusinessException
   */
  protected ClassifiedHashtable checkOca(IVersionedPersistent entity, long oca,
      String classCaption, String entitySpec) throws BusinessException {
    if (entity.getUuid() != null && entity.getOca() != oca) {
      ClassifiedHashtable h = new ClassifiedHashtable();
      h.putMessage("oca", ClassifiedHashtable.ERROR, "指定" + classCaption + "[" + entitySpec
          + "]已经被其他用户修改，操作将被取消。");
      return h;
    } else
      return null;
  }

}
